package main;

import asa.*;
import java.io.*;

public class Cl {

    public static void main( String []args ) {
    	String is =
    		"@step = 1;\n" +
    		"x = 0;\n" +
    		"mova 100;\n" +
    		"vire 90;\n" +
    		"mova 100;\n" +
    		"vire x + 10;\n" +
    		"x = x + 50;\n" +
    		"mova x;\n" +
    		"i = 0;\n" +
    		"enquanto i < 10 faça [\n" +
    		"    mova i;\n" +
    		"];\n";
    	char []input = is.toCharArray();
    	AtorCompilationUnit acu = new AtorCompilationUnit();

    	/*
    	 * deve existir um botão "compile" ou "ok" no codeg ator. Teclando-se
    	 * este botão, o código Locyan será compilado:
    	 *            	acu.compile("fagundes", input);
		 * Observe que você passa um vetor de caracteres "input" e o nome
		 * do ator como parâmetros.
    	 * Se houver erros,
    	 * estes devem ser apresentados ao usuário. Se não houver, guarde
    	 * o resultado de acu.getGeneratedCode().toString() em um variável de instância.
    	 * Este é o código que deverá ser passado ao compilador quando este
    	 * pedir o código gerado pelo Codeg. Isto é, o método genJava() do
    	 * codeg deverá retornar a variável de instância que guarda a string
    	 * retornada por acu.getGeneratedCode().toString().
    	 */

    	acu.compile("fagundes", input);
    	if ( acu.getCompilationErrorList().size() > 0 ) {
    		// você (Allan) deve mostrar os erros de compilação na janela do codeg ator.
    		// aqui eu imprimo na saída padrão.
        	acu.getCompilationErrorList().print(new PrintWriter(System.out));
    	}
    	else {
    		// sem erros de compilação. Você, Allan, não deverá fazer nada, apenas
    		// guardar em alguma variável de instância do Codeg a StringBuffer
    		// obtida através de acu.getGeneratedCode().toString().
    		// Aqui eu imprimo esta string na saída padrão
    		System.out.println(acu.getGeneratedCode().toString());
    	}


    }

    public static void main2( String []args ) {

        File file;
        FileReader stream;
        int numChRead;
        Program program;

        if ( args.length != 1 &&  args.length != 2 )  {
            System.out.println("Usage:\n   Cl input [output]");
            System.out.println("input is the file to be compiled");
            System.out.println("output is the file where the generated code will be stored");
        }
        else {
           file = new File(args[0]);
           if ( ! file.exists() || ! file.canRead() ) {
             System.out.println("Either the file " + args[0] + " does not exist or it cannot be read");
             return ;
           }
           try {
             stream = new FileReader(file);
            } catch ( FileNotFoundException e ) {
                System.out.println("Something wrong: file does not exist anymore");
                throw new RuntimeException();
            }
                // one more character for '\0' at the end that will be added by the
                // compiler
            char []input = new char[ (int ) file.length() + 1 ];

            try {
              numChRead = stream.read( input, 0, (int ) file.length() );
            } catch ( IOException e ) {
                System.out.println("Error reading file " + args[0]);
                return ;
            }

            if ( numChRead != file.length() ) {
                System.out.println("Read error");
                return ;
            }
            try {
              stream.close();
            } catch ( IOException e ) {
                System.out.println("Error in handling the file " + args[0]);
                return ;
            }


            Compiler compiler = new Compiler();

            String outputFileName;
            if ( args.length == 2 )
              outputFileName = args[1];
            else {
                outputFileName = args[0];
                int lastIndex;
                if ( (lastIndex = outputFileName.lastIndexOf('.')) == -1 )
                  lastIndex = outputFileName.length();
                StringBuffer sb = new StringBuffer(outputFileName.substring(0, lastIndex));
                sb.append(".java");
                outputFileName = sb.toString();
            }

            FileOutputStream  outputStream;
            try {
               outputStream = new FileOutputStream(outputFileName);
            } catch ( IOException e ) {
                System.out.println("File " + args[1] + " was not found");
                return ;
            }
            PrintWriter printWriter = new PrintWriter(outputStream);
            program = null;

              // the generated code goes to a file and so are the errors
            program  = compiler.compile(input );
            if ( compiler.getCompilationErrorList().size() > 0 )
            	compiler.getCompilationErrorList().print(new PrintWriter(System.out));


            if ( program != null ) {
               PW pw = new PW();
               pw.set(printWriter);
               program.genJava( pw, "LadyBug" );
               if ( printWriter.checkError() ) {
                  System.out.println("There was an error in the output");
               }
            }
        }
    }
}
